#include "../lib/gpio.h"

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>

static gpio_t *gpio_out, *gpio_in;

void timeout_handler(int sig)
{
	static bool status = false;
	if (gpio_write(gpio_out, status) < 0)
	{
		fprintf(stderr, "gpio_write(): %s\n", gpio_errmsg(gpio_out));
		exit(1);
	}
	else
	{
		printf("GPIO4_A2 STA %d\r\n", status);
		status = !status;
	}
}

void ctrl_c_handle(int sig)
{
	printf("CTRL + C -> free gpio_out gpio_in\r\n");
	
	gpio_close(gpio_out);
	gpio_free(gpio_out);

	gpio_close(gpio_in);
	gpio_free(gpio_in);
}


int main(void)
{
	printf("gpio demo \r\n");

	/* GPIO4_A2 输出 */
	gpio_out = gpio_new();
	if (gpio_open(gpio_out, "/dev/gpiochip4", 2, GPIO_DIR_OUT_HIGH) < 0)
	{
		fprintf(stderr, "gpio_open(): %s\n", gpio_errmsg(gpio_out));
		exit(1);
	}

	/* GPIO4_A1 输入 */
	gpio_in = gpio_new();
	if (gpio_open(gpio_in, "/dev/gpiochip4", 1, GPIO_DIR_IN) < 0)
	{
		fprintf(stderr, "gpio_open(): %s\n", gpio_errmsg(gpio_in));
		exit(1);
	}

	/*初始化定时器定时反转*/
	signal(SIGALRM, timeout_handler);
	struct itimerval timer = {
		.it_value = {.tv_sec = 1, .tv_usec = 0},		// 首次触发 1秒
		.it_interval = {.tv_sec = 1, .tv_usec = 0}	// 触发周期 1秒
	};
	setitimer(ITIMER_REAL, &timer, NULL); // 启动定时器

	/*CTRL+C 回调*/
	signal(SIGINT, ctrl_c_handle);
	
	printf("read io start\r\n");
	while (1)
	{
		static bool last_sta = false;
		bool cur_sta = false;
		if (gpio_read(gpio_in, &cur_sta) >= 0)
		{
			/*分析读取到的电压*/
			if (cur_sta != last_sta)
			{
				printf("GPIO %d -> %d\r\n", last_sta, cur_sta);
				last_sta = cur_sta;
			}
		}
		usleep(1000);
	}

	return 0;
}